home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / WORLDSRC.ZIP / WORLD.C < prev    next >
C/C++ Source or Header  |  1992-08-13  |  11KB  |  563 lines

  1. #define EXTERN 
  2.  
  3. #include "parame.inc"
  4. #include "variab.h"
  5. #include "locdat.inc"
  6. #include "objdat.inc"
  7. #include "objdes.inc"
  8. #include "gtext.inc"
  9.  
  10. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  11.    Use as you like for non-commercial purposes, but please
  12.    leave this note, and document any changes you make as yours */
  13.  
  14. static int     i, xloc, mxscor, succes, mloc, ikk, verb, vretrn;
  15. static int     scor, xretn, yretn, h, errflg;
  16.  
  17. main()
  18. {
  19.  
  20.     rdinit();
  21.     wwflag = 0;
  22.     nomor = 0;
  23.     speak(29);
  24.     linout(" ", 1);
  25.     slflag = 0;
  26.     speak(gtext[1] + 1);
  27.     xindnt = 0;
  28.     for (i = 0; i < 9; i++)
  29.     marflg[i] = 0;
  30.     for (i = 0; i < 6; i++)
  31.     wirelc[i] = 0;
  32.     brfflg = 1;
  33.     deadf = 0;
  34.     dirty = 0;
  35.     turns = 0;
  36.     more = 0;
  37.     diesc = 0;
  38.     horflg = 0;
  39.     nonext = 0;
  40.     screef = 0;
  41.     spcloc = 0;
  42.     oldloc = 1;
  43.     oldlc2 = 1;
  44.     loc = 1;
  45.     xloc = 0;
  46.     oextim = 0;
  47.     rdietm = 0;
  48.     rvtim = 0;
  49.     gvtim = 0;
  50.     eattim = 0;
  51.     easttm = 0;
  52.     filmtm = 0;
  53.     filmst = 0;
  54.     machst = 0;
  55.     fimage = 0;
  56.     dial1x = -1;
  57.     dial2x = -1;
  58.     dial1 = 0;
  59.     dial2 = 0;
  60.     eastsc = 0;
  61.     cactsc = 0;
  62.     mxscor = 450;
  63.     bonus = 0;
  64.     jackpo = 0;
  65.     lpill = 0;
  66.     pbstat = 0;
  67.     dcombi = -1;
  68.     chaset = 0;
  69.     chaser = 0;
  70.     fshlif = 8;
  71.     noshoe = 8;
  72.     guardl = 0;
  73.     eolflg = 1;
  74.     linout(" ", 1);
  75.     /* the main command loop!!!!!  */
  76.  
  77. lab1:
  78.     if (eolflg) {
  79.     getln();
  80.     dotflg = 0;
  81.     clause = 1;
  82.     actor = 1;
  83.     lptr = 0;
  84.     }
  85.     succes = scan();
  86.     if (!succes)
  87.     eolflg = 1;
  88.     if (!succes)
  89.     goto lab1;
  90.     succes = parse();
  91.     clause += 1;
  92.     if (!succes)
  93.     eolflg = 1;
  94.     if (!succes)
  95.     goto lab1;
  96.     errflg = 0;
  97.     /******        for "tell someone" or "ask someone"  */
  98.  
  99.     if (actor != 1) {
  100.  
  101.     otheract();    /* perform verbs for other than player */
  102.  
  103.  
  104.     timer(xloc);
  105.     /* this goto is for permanent death due to radiation poisoning */
  106.  
  107.     {
  108.         if (rdietm == 50)
  109.         goto lab9000;
  110.         nonext = 1;
  111.         goto lab3000;
  112.     }
  113.     }
  114.     /******/
  115.  
  116.  
  117.  
  118.  
  119.     verb = wrdnum[0];
  120.  
  121.     playerv();    /* this does all the verbs for player */
  122.  
  123.  
  124.     if (errflg == 1)
  125.     goto lab9000;
  126.     if (errflg == 2)
  127.     goto lab9990;
  128.     {
  129.     if (deadf && loc >= 153)
  130.         goto lab9000;
  131.     }
  132.     timer(xloc);
  133.     /*
  134.      * this goto is for permanent death due to radiation poisoning or death
  135.      * in endgame 
  136.      */
  137.  
  138.     {
  139.     if (rdietm == 50 || (loc >= 153 && deadf))
  140.         goto lab9000;
  141.     }
  142.     h = 0;
  143.     {
  144.     if (loc != xloc) {
  145.         /* get out of any special locations (like on glass) */
  146.  
  147.         if (!(loc == 187 || loc == 184 || (loc >= 175
  148.                            && loc <= 181)))
  149.         spcloc = 0;
  150.         if (wirelc[5] == 1000 || obloc[ZWIRE] == 1000)
  151.         wdemon();
  152.         h = 1;
  153.     }
  154.     }
  155.     /* announce new location  */
  156.  
  157.     {
  158.     if (!nonext || (loc >= 7 && loc <= 11) ||
  159.         (loc >= 100 && loc <= 116)) {
  160.         linout(" ", 1);
  161.         if (loc >= 7 && loc <= 11)
  162.         h = 1;
  163.         vlocat(0, h);
  164.     }
  165.     if (loc >= 26 && loc <= 51) {
  166.         linout(" ", 1);
  167.         mdemon();
  168.     }
  169.     }
  170.  
  171.     /* cat function */
  172.  
  173. lab3000:
  174.     {
  175.     if (obloc[ZCAT] == 1000 || (obloc[ZCAT] == (2000 + ZKNAPS) &&
  176.              (obloc[ZKNAPS] == 3000 || obloc[ZKNAPS] == loc))) {
  177.         if (loc == 149 && obloc[ZCART] == 0) {
  178.         speak(290);
  179.         obloc[ZCAT] = loc;
  180.         obloc[ZCART] = loc;
  181.         } else if (obloc[ZCAT] == 2000 + ZKNAPS && obloc[ZKNAPS] == 3000
  182.                && pct(5)) {
  183.         speak(287);
  184.         obloc[ZCAT] = 1000;
  185.         } else if (pct(3))
  186.         speak(288);
  187.         else if (pct(3))
  188.         speak(289);
  189.     }
  190.     }
  191.     /* robot activation */
  192.  
  193.     {
  194.     if ((obimpr[RSLOT] & 8192) == 8192) {
  195.         obimpr[RSLOT] -= 8192;
  196.         if (obloc[ZCART] == 2000 + RSLOT)
  197.         speak(310);
  198.         else
  199.         speak(365);
  200.     }
  201.     }
  202.     /* give bonus for reaching cygnus or deneb */
  203.  
  204.     {
  205.     if (loc == 183) {
  206.         if ((locdat[183] & 16384) == 0) {
  207.         speak(549);
  208.         bonus += 5;
  209.         } else if (xloc != loc)
  210.         speak(550);
  211.     } else if (loc == 186) {
  212.         if ((locdat[186] & 16384) == 0)
  213.         speak(547);
  214.         else if (xloc != loc)
  215.         speak(548);
  216.     } else if (loc == 190) {
  217.         speak(551);
  218.         bonus += 5;
  219.         goto lab9000;
  220.     }
  221.     }
  222.     {
  223.     if (loc == xloc && loc == 171) {
  224.         speak(557);
  225.         vdead();
  226.         goto lab9000;
  227.     }
  228.     }
  229.     xloc = loc;
  230.     turns += 1;
  231.     nonext = 0;
  232.     /* we have visited this location  */
  233.  
  234.     locdat[loc] |= 16384;
  235.     linout(" ", 1);
  236.     goto lab1;
  237. lab9000:
  238.     linout(" ", 1);
  239.     scor = scorng() + bonus * 5;
  240.     scorpt(scor, mxscor);
  241.     goto lab9999;
  242. lab9990:
  243.     endsl();
  244. lab9999:
  245.     return ;
  246. }
  247.  
  248. /* end of main program  */
  249.  
  250.  
  251. otheract()
  252. {
  253.     static int      actok;
  254.  
  255.     if (actor == MARTIA) {
  256.     if (martim == 7 && loc >= 27 && loc <= 51)
  257.         speak(167);
  258.     else
  259.         speak(168);
  260.     } else if (actor == ROBOT) {
  261.     {
  262.         if (chgact == 1)
  263.         actok = 1;
  264.     }
  265.     /* test to see if robot can "hear"  */
  266.  
  267.     if (chgact == 1 && obloc[CCART] == (2000 + RSLOT) &&
  268.         (loc == 146 || obloc[ZROBOT] == loc)) {
  269.         speak(366);
  270.         actok = 0;
  271.     } else if (chgact == 1 && !((loc == obloc[ZROBOT] ||
  272.                loc == 146) && obloc[ZCART] == (2000 + RSLOT))) {
  273.         speak(314);
  274.         actok = 0;
  275.     } else if (chgact == 0 && actok == 0);
  276.     else if (wrdnum[0] == GO) {
  277.         mloc = obloc[ZROBOT];
  278.         vgo();
  279.         {
  280.         if (obloc[ZROBOT] == 90)
  281.             obimpr[ZROBOT] = 2257;
  282.         }
  283.         {
  284.         if (rmove == 1 && (loc == mloc))
  285.             speak(316);
  286.         else if (rmove == 1 && mloc != loc && obloc[ZROBOT] == loc)
  287.             speak(317);
  288.         else if (rmove == 1 && loc == 146)
  289.             robdsc();
  290.         }
  291.         {
  292.         if (obloc[ZROBOT] == 90) {
  293.             if (obloc[ZORCHI] == 2000 + ZROBOT)
  294.             obloc[ZORCHI] = 0;
  295.             else if (obloc[ZFLYTR] == 2000 + ZROBOT)
  296.             obloc[ZFLYTR] = 0;
  297.         }
  298.         }
  299.     } else if (wrdnum[0] == TAKE || wrdnum[0] == DROP ||
  300.            wrdnum[0] == PUT || wrdnum[0] == IS || wrdnum[0] ==
  301.            TRANSL || wrdnum[0] == WASH || wrdnum[0] == QWATER
  302.            || wrdnum[0] == HOLD || wrdnum[0] == GIVE)
  303.         vrobot();
  304.     else
  305.         speak(315);
  306.     } else if (actor == FERRET) {
  307.     if (loc != 131 && loc != 99 && loc != 100)
  308.         speak(435);
  309.     else
  310.         speak(436);
  311.     } else if (actor == CACTUS) {
  312.     if (loc != 82)
  313.         speak(437);
  314.     else if (cactsc != 3)
  315.         speak(438);
  316.     /* cactus freezing scree sclope */
  317.  
  318.     else if ((wrdnum[0] == HOLD || wrdnum[0] == FREEZE) &&
  319.          dobjs[0] == GRAVEL) {
  320.         screef = 4;
  321.         speak(441);
  322.     } else
  323.         speak(237);
  324.     } else if (actor == GUARD) {
  325.     if (loc == guardl || loc == 171 || (chaset != 0 &&
  326.                         chaset <= 9))
  327.         speak(562);
  328.     else if(loc >= 153)
  329.         speak(561);
  330.         else
  331.             speak(251);
  332.     } else
  333.     speak(251);
  334. }
  335.  
  336. playerv()
  337. {
  338.     if (verb < TAKE) {
  339.     vretrn = 1;
  340.     {
  341.         if (verb == RUN)
  342.         vretrn = vrun();
  343.         else if (verb == CRAWL)
  344.         vretrn = vcrawl();
  345.         else if (verb == CROSS)
  346.         vretrn = vcross();
  347.         else if (verb == JUMP)
  348.         vretrn = vjump();
  349.         else if (verb == ASCEND) {
  350.         prepdo = UP;
  351.         vretrn = vclimb();
  352.         } else if (verb == DESCEN) {
  353.         prepdo = DOWN;
  354.         vretrn = vclimb();
  355.         } else if (verb == CLIMB)
  356.         vretrn = vclimb();
  357.         else if (verb == SWIM)
  358.         vretrn = vswim();
  359.     }
  360.  
  361.     /*
  362.      * if vretrn=0, then the action is complete if vretrn=1, then a
  363.      * translation to "go" occured or the verb was actually "go" 
  364.          */
  365.  
  366.     {
  367.         if (vretrn == 1)
  368.         vgo();
  369.     }
  370.     } else if (verb == QUIT) {
  371.     if (yesx(101))
  372.         errflg = 1;    /* out after scoring */
  373.  
  374.     } else if (verb == DAMN)
  375.     dirty += 1;
  376.     else if (verb == SUSPEN)
  377.     if (chaset == 0)
  378.         vsuspe(0);
  379.     else
  380.         speak(559);
  381.     else if (verb == RESTOR) {
  382.     if (vsuspe(1)) {
  383.         eolflg = 1;
  384.         nonext = 0;
  385.         actor = 1;
  386.         xloc = loc;
  387.     }
  388.     } else if (verb == BRIEF)
  389.     brfflg = 1;
  390.     else if (verb == VERBOS)
  391.     brfflg = 2;
  392.     else if (verb == SUPERB)
  393.     brfflg = 0;
  394.     else if (verb == QMORE)
  395.     nomor = 0;
  396.     else if (verb == NOMORE)
  397.     nomor = 1;
  398.     else if (verb == SCORE) {
  399.     scor = scorng() + bonus * 5;
  400.     scorpt(scor, mxscor);
  401.     } else if (verb == HELP)
  402.     vhelp();
  403.     else if (verb == RETREA)
  404.     vretre();
  405.     else if (verb == PRAY) {
  406.     if (!deadf || loc != 61)
  407.         speak(44);
  408.     else {
  409.         deadf = 0;
  410.         speak(45);
  411.         nonext = 1;
  412.         noshoe = 8;
  413.     }
  414.     } else if (verb == DEBUG)
  415.     dbg();
  416.     else if (verb == LOCATE) {
  417.     vlocat(1, 1);
  418.     nonext = 1;
  419.     } else if (!deadf) {
  420.     if (verb == TAKE || verb == REMOVE || verb == CARRY ||
  421.         verb == HOLD)
  422.         vtake();
  423.     else if (verb == DROP)
  424.         vdrop();
  425.     else if (verb == THROW) {
  426.         if (!vthrow())
  427.         vdrop();
  428.     } else if (verb == SIT)
  429.         vsit();
  430.     else if (verb == STAND)
  431.         vstand();
  432.     else if (verb == GET) {
  433.         xretn = vget();
  434.         {
  435.         if (xretn == 1)
  436.             vtake();
  437.         }
  438.     } else if (verb == SHOOT)
  439.         vshoot();
  440.     else if (verb == OPEN)
  441.         vopen();
  442.     else if (verb == SHUT)
  443.         vshut();
  444.     else if (verb == LAND || verb == ACTIVA)
  445.         vship();
  446.     else if (verb == SCRATC)
  447.         vscrat();
  448.     else if (verb == TRANSL)
  449.         speak(71);
  450.     else if (verb == ATTACH)
  451.         vattac();
  452.     else if (verb == POUR || verb == QWATER) {
  453.         if (vpour() == 1)
  454.         vput();
  455.     } else if (verb == WASH)
  456.         vwash();
  457.     else if (verb == EAT)
  458.         veat();
  459.     else if (verb == DRINK)
  460.         vdrink();
  461.     else if (verb == FILL) {
  462.         if (vfill() == 1)
  463.         vpour();
  464.     } else if (verb == IGNITE)
  465.         speak(39);
  466.     else if (verb == TURN)
  467.         vturn();
  468.     else if (verb == READ)
  469.         vread();
  470.     else if (verb == BREAK)
  471.         vbreak();
  472.     else if (verb == FREEZE)
  473.         speak(442);
  474.     else if (verb == PICK) {
  475.         xretn = vpick();
  476.         {
  477.         if (xretn == 1)
  478.             vtake();
  479.         }
  480.     } else if (verb == WEAR)
  481.         vwear();
  482.     else if (verb == PUT) {
  483.         xretn = vput();
  484.         {
  485.         if (xretn == 1)
  486.             vwear();
  487.         if (xretn == 2)
  488.             vdrop();
  489.         if (xretn == 3)
  490.             vpour();
  491.         }
  492.     } else if (verb == LOCK || verb == UNLOCK)
  493.         vlocks();
  494.     else if (verb == LOOK || verb == EXAMIN)
  495.         vlooks();
  496.     else if (verb == PUSH || verb == KISS) {
  497.         {
  498.         if (verb == KISS)
  499.             yretn = vkiss();
  500.         }
  501.         if (yretn == 1 || verb == PUSH) {
  502.         xretn = vpush();
  503.         /* oops! the nova button */
  504.  
  505.         if (xretn == 1)
  506.             errflg = 2;    /* instant out */
  507.  
  508.         else if (xretn > 1) {
  509.             bonus = xretn * 2;
  510.             {
  511.             if (xretn < 5)
  512.                 errflg = 1;    /* out after scoring */
  513.  
  514.             }
  515.             /* change to the "endgame" */
  516.  
  517.             scor = scorng();
  518.             bonus += scor / 5;
  519.             loc = 153;
  520.             oldloc = 0;
  521.             oldlc2 = 0;
  522.             {
  523.             for (ikk = 1; ikk <= SCOIN; ikk++)
  524.                 if (obloc[ikk] != 1000 && obloc[ikk] != 3000)
  525.                 obloc[ikk] = 0;
  526.             }
  527.             obloc[ZKNAPS] = 0;
  528.         }
  529.         }
  530.     } else if (verb == PUNCH) {
  531.         if (vpunch() == 1)
  532.         vbreak();
  533.     } else if (verb == ATTACK)
  534.         vattak();
  535.     else if (verb == DIG)
  536.         vdig();
  537.     else if (verb == GIVE || verb == FEED)
  538.         vgive();
  539.     else if (verb == IS)
  540.         speak(467);
  541.     else if (verb == FUCK) {
  542.         dirty += 1;
  543.         vfuck();
  544.     } else if (loc == 127 && (verb == SHIT || verb == EXHALE
  545.                   || verb == PISS)) {
  546.         loc = 126;
  547.         oldloc = 0;
  548.         oldlc2 = 0;
  549.         speak(312);
  550.     } else if (verb == EXHALE)
  551.         speak(313);
  552.     else if (verb == PISS) 
  553.             vpiss();
  554.     else if (verb == SHIT) 
  555.             vshit();
  556.     else if (verb == INVENT)
  557.         vinven();
  558.     else;
  559.     }
  560.     else speak(46);
  561.  
  562. }
  563.